package GUI;
import java.awt.BorderLayout;
import java.util.ArrayList;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JList;
import OBS.InputValidator;
import OBS.BatchReportInterval;
import OBS.BatchReportSystem;
import OBS.Customer;
import OBS.OBSReportSubscriber;
import OBS.OBSReportSubscription;

/**
 * Returnerer "null" hvis der trykkes cancel så husk at tjekke for null værdier
 * inden der indlæses i DB
 *
 * confirmDelete fungerer anderledes end de andre metoder.
 * Den returnerer en boolean værdi der angiver om en bruger bekræfter sletning.
 * confirmDelete er overloaded: Man kan sende en String med som parameter. Se
 * confirmDelete nederst.
 *
 * @author Jesper Wistoft
 */
public class ShowPopUp {

    /**
     * Opretter en customer udfra navn og validerer navnet
     * 
     * @return customer objekt med validt navn eller "null" hvis der trykkes 
     * cancel
     */
    public static Customer createCustomer() {
        boolean inputValidated = false;
        String name;
        Customer customer = null;

        // komponenter sættes op
        JPanel inputPanel = new JPanel();
        JLabel nameL = new JLabel("Navn: ");
        JTextField nameF = new JTextField(25);
        // komponenter samles
        inputPanel.add(nameL);
        inputPanel.add(nameF);

        while (!inputValidated){
        int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast kundenavn", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                name = nameF.getText();
                if (!InputValidator.validateCustomerName(name)) {
                    JOptionPane.showMessageDialog(null, "Ugyldigt kunde navn.\n Kundenavn skal indeholde mellem 1 og 100 tegn");
                } else {
                    inputValidated = true;
                    customer = new Customer(0 , name, null, null);
                }
            }
            if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
                }
        } return customer;
    }

    /**
     * Tillader ændring af en customers navn, validerer navnet
     *
     * @param customer den customer der skal ændres i
     * @return customer objekt med ændret validt navn eller "null" hvis der
     * trykkes cancel
     */
    public static Customer editCustomer(Customer customer) {
        boolean inputValidated = false;
        String name;

        // komponenter sættes op
        JPanel inputPanel = new JPanel();
        JLabel nameL = new JLabel("Navn: ");
        JTextField nameF = new JTextField(25);
        nameF.setText((customer.getName()));
        // komponenter samles
        inputPanel.add(nameL);
        inputPanel.add(nameF);

        while (!inputValidated){
        int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast kundenavn", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                name = nameF.getText();
                if (!InputValidator.validateCustomerName(name)) {
                    JOptionPane.showMessageDialog(null, "Ugyldigt kunde navn.\n Kundenavn skal indeholde mellem 1 og 100 tegn");
                } else {
                    inputValidated = true;
                    customer.setName(name);
                }
            }
            if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
                }
        } return customer;
    }

    /**
     * Opretter et batchReportSystem udfra en valgt customer og ved angivelse af
     * et eller flere ønskede BatchReportIntervaller
     *
     * @param customer den customer der skal tilknyttes dette batchReportSystem
     * @param intervals de intervaller der kan vælges imellem
     * @return batchReportSystem knyttet til den ønskede customer og med de
     * valgte intervaller eller "null" hvis der trykkes cancel
     */
    public static BatchReportSystem createBatchReportSystem(Customer customer, BatchReportInterval[] intervals) {
        boolean inputValidated = false;
        BatchReportSystem system = null;
        BatchReportInterval interval = null;
        String systemName;
        // komponenter sættes op
        JPanel inputPanel = new JPanel(new BorderLayout(5,5));
        JPanel namePanel = new JPanel();
        JLabel systemNameL = new JLabel("Navn: ");
        JLabel intervalL = new JLabel("Vælg Interval: ");
        JTextField systemNameF = new JTextField(25);
        JList intervalList = new JList(intervals);
        intervalList.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
        // komponenter samles
        namePanel.add(systemNameL);
        namePanel.add(systemNameF);
        inputPanel.add(namePanel, BorderLayout.PAGE_START);
        inputPanel.add(intervalL,BorderLayout.CENTER);
        inputPanel.add(intervalList, BorderLayout.PAGE_END);

        while (!inputValidated){
            int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast batch system navn og vælg interval", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                // værdierne indlæses
                try { interval = (BatchReportInterval)intervalList.getSelectedValue(); }
                    catch (Exception ex) { JOptionPane.showMessageDialog(null, "Intet interval valgt."); inputValidated = false; }

                systemName = systemNameF.getText();
                if (!InputValidator.validateReportSystemName(systemName)) {
                     JOptionPane.showMessageDialog(null, "Ugyldigt batch system navn.\n Navnet må kun indeholde engelske bogstaver samt _(underscore) eller -(bindestreg). \n Mellemrum er ikke et gyldigt tegn. \n Navnet må max indeholde 100 tegn.");
                 } else {
                        inputValidated = true;
                        system = new BatchReportSystem(0,systemName,interval,null);
                        }
                }
            if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
            }
        }
        return system;
    }

    /**
     * Tillader ændring i et batchReportSystem
     * @param system det batchReportSystem der skal ændres
     * @param intervals de intervaller der kan vælges imellem
     * @return batchReportSystem med de nye intervaller eller "null" hvis der
     * trykkes cancel
     */
     public static BatchReportSystem editBatchReportSystem(BatchReportSystem system, BatchReportInterval[] intervals) {
        boolean inputValidated = false;
        BatchReportInterval interval = null;
        String systemName;
        // komponenter sættes op
        JPanel inputPanel = new JPanel(new BorderLayout(5,5));
        JPanel namePanel = new JPanel();
        JLabel systemNameL = new JLabel("Navn: ");
        JLabel intervalL = new JLabel("Vælg Interval: ");
        JTextField systemNameF = new JTextField(25);
        systemNameF.setText((system.getName()));
        JList intervalList = new JList(intervals);
        intervalList.setSelectedValue(system.getBatchReportInterval(),true);
        intervalList.setSelectionMode(DefaultListSelectionModel.SINGLE_SELECTION);
        intervalList.setSelectedValue(system.getBatchReportInterval(), true);
        // komponenter samles
        namePanel.add(systemNameL);
        namePanel.add(systemNameF);
        inputPanel.add(namePanel, BorderLayout.PAGE_START);
        inputPanel.add(intervalL,BorderLayout.CENTER);
        inputPanel.add(intervalList, BorderLayout.PAGE_END);

        while (!inputValidated){
            int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast batch system navn og vælg interval", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                // værdierne indlæses
                try { interval = (BatchReportInterval)intervalList.getSelectedValue(); }
                    catch (Exception ex) { JOptionPane.showMessageDialog(null, "Intet interval valgt."); inputValidated = false; }

                systemName = systemNameF.getText();
                if (!InputValidator.validateReportSystemName(systemName)) {
                     JOptionPane.showMessageDialog(null, "Ugyldigt batch system navn.\n Navnet må kun indeholde engelske bogstaver samt _(underscore) eller -(bindestreg).\n Navnet må max indeholde 100 tegn.");
                 } else {
                        inputValidated = true;
                        system.setName(systemName);
                        system.setBatchReportInterval(interval);
                        }
                }
            if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
            }
        }
        return system;
    }

    /**
     * Opret en OBSReportSubscriber ved at angive person navn og email adresse,
     * validerer person navn og  email adresse
     *
     * @return en OBSReportSubscriber med validt person navn og valid email
     * adresse eller "null" hvis der trykkes cancel
     */
    public static OBSReportSubscriber createOBSReportSubscriber() {
        boolean inputValidated = false;
        OBSReportSubscriber subscriber = null;
        String email;
        String name;

        // komponenter sættes op
        JPanel inputPanel = new JPanel();
        JLabel nameL = new JLabel("Navn: ");
        JLabel emailL = new JLabel("Email: ");
        JTextField nameF = new JTextField(25);
        JTextField emailF = new JTextField(25);
        // komponenter samles
        inputPanel.add(nameL);
        inputPanel.add(nameF);
        inputPanel.add(emailL);
        inputPanel.add(emailF);

        while (!inputValidated){
            int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast person navn og email adresse", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
                if ( select == JOptionPane.OK_OPTION ) {
                    // værdierne indlæses i et string array
                    name = nameF.getText();
                    email = emailF.getText();
                    if (!InputValidator.validateSubscriberName(name)) {
                        JOptionPane.showMessageDialog(null, "Ugyldigt abonent navn.\n Navnet må kun indeholde bogstaver.");
                    }
                    else if(!InputValidator.validateEmail(email)) {
                        JOptionPane.showMessageDialog(null, "Ugyldigt email adresse.");
                    } else {
                        inputValidated = true;
                        subscriber = new OBSReportSubscriber(0, name, email, null);
                    }
                }
                if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
                }
            }
        return subscriber;
    }

    /**
     * Tillader ændring af en OBSReportSubscriber med angivelse og validering af
     * nyt/ændret person navn og ny/ændret email adresse
     *
     * @param den OBSReportSubscriber der skal ændres i
     * @return OBSReportSubscriber med validt nyt/ændret person navn og valid
     * ny/ændret email adresse eller "null" hvis der trykkes cancel
     */
     public static OBSReportSubscriber editOBSReportSubscriber(OBSReportSubscriber subscriber) {
        boolean inputValidated = false;
        String email;
        String name;

        // komponenter sættes op
        JPanel inputPanel = new JPanel();
        JLabel nameL = new JLabel("Navn: ");
        JLabel emailL = new JLabel("Email: ");
        JTextField nameF = new JTextField(25);
        JTextField emailF = new JTextField(25);
        nameF.setText((subscriber.getName()));
        emailF.setText((subscriber.getEmail()));
        // komponenter samles
        inputPanel.add(nameL);
        inputPanel.add(nameF);
        inputPanel.add(emailL);
        inputPanel.add(emailF);

        while (!inputValidated){
            int select = JOptionPane.showConfirmDialog(null, inputPanel, "Indtast person navn og email adresse", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
                if ( select == JOptionPane.OK_OPTION ) {
                    // værdierne indlæses i et string array
                    name = nameF.getText();
                    email = emailF.getText();
                    if (!InputValidator.validateSubscriberName(name)) {
                        JOptionPane.showMessageDialog(null, "Ugyldigt abonent navn.\n Navnet må kun indeholde bogstaver.");
                    }
                    if (!InputValidator.validateEmail(email)) {
                        JOptionPane.showMessageDialog(null, "Ugyldigt email adresse.");
                    } else {
                        inputValidated = true;
                        subscriber.setSubscriberName(name);
                        subscriber.setEmail(email);
                    }
                }
                if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
                }
            }
        return subscriber;
    }

    /**
     * Tillader at man tilvælger batchReportSystemer til en subscriber
     *
     * @param subscriber der skal have tilknyttet batchReportSystems
     * @param systems de BatchReportSystems der kan vælges imellem
     * @return OBSReportSubscriber med de tilvalgte batchReportSystems
     */
    public static OBSReportSubscriber editOBSReportSubscription(OBSReportSubscriber subscriber, BatchReportSystem[] systems) {
        String subscriberName = subscriber.getName();
        BatchReportSystem[] systemsSelected = null;
        // komponenter sættes op
        JPanel inputPanel = new JPanel(new BorderLayout(5,5));
        JLabel systemL1 = new JLabel("Vælg abonementer for: " + subscriberName);
        JLabel systemL2 = new JLabel ("<html><I>Hold Ctrl nede for at vælge flere.</I></html>");
        JList systemList = new JList(systems);
        BatchReportSystem[] subscriberSystems = subscriber.getOBSReportSubscription().getBatchReportSystems();
        ArrayList<Integer> selectedSystems = new ArrayList<Integer>();
        for(int i = 0;i < systems.length;i++) {
            for(int j = 0;j < subscriberSystems.length;j++) {
                if(systems[i].equals(subscriberSystems[j])) {
                    selectedSystems.add(i);
                }
            }
        }
        int[] selectedSystemsInt = new int[selectedSystems.size()];
        for(int i = 0;i < selectedSystems.size();i++) {
            selectedSystemsInt[i] = selectedSystems.get(i);
        }
        systemList.setSelectedIndices(selectedSystemsInt);

        // komponenter samles
        inputPanel.add(systemL1, BorderLayout.PAGE_START);
        inputPanel.add(systemList, BorderLayout.CENTER);
        inputPanel.add(systemL2, BorderLayout.PAGE_END);

            int select = JOptionPane.showConfirmDialog(null, inputPanel, "Vælg abonementer for: " + subscriberName, JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                try {
                    Object[] temp = systemList.getSelectedValues();
                    systemsSelected = new BatchReportSystem[temp.length];
                    for(int i = 0;i < temp.length;i++) {
                        systemsSelected[i] = (BatchReportSystem)temp[i];
                    }
                }
                catch (Exception ex) { JOptionPane.showMessageDialog(null, "Ingen systemer valgt.");}
                  subscriber.setOBSReportSubscription(new OBSReportSubscription(systemsSelected));
            }
             if ( select == JOptionPane.CANCEL_OPTION ) {
                return null;
             }
            return subscriber;
    }

     /**
      * Vis en beksed
      *
      * @param message den besked der ønskes vist
      */public static void showMessage(String message) {
             JOptionPane.showMessageDialog(null,message);
             }

     /**
      * fungerer anderledes end de andre metoder.
      * Den returnerer en boolean værdi der angiver om en bruger bekræfter
      * sletning.
      *
      * @return true/false
      */
     public static boolean confirmDelete() {
         int select = JOptionPane.showConfirmDialog(null,new JLabel("Bekræft sletning."), "Bekræft sletning.", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                return true;
             }
             if ( select == JOptionPane.CANCEL_OPTION ) {
                return false;
             }
         return false;
     }

     /**
      * fungerer anderledes end de andre metoder.
      * Den returnerer en boolean værdi der angiver om en bruger bekræfter
      * sletning.
      *
      * @param string besked der ønskes vist
      * @return tru/false
      */
     public static boolean confirmDelete(String string) {
         int select = JOptionPane.showConfirmDialog(null,new JLabel(string), "Bekræft sletning", JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
            if ( select == JOptionPane.OK_OPTION ) {
                return true;
             }
             if ( select == JOptionPane.CANCEL_OPTION ) {
                return false;
             }
         return false;
     }
}